package com.showsu.editor.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.showsu.editor.entity.po.TblUserExppackage;
import com.showsu.editor.enums.UserExpPackageTypeEnum;

import java.util.Date;
import java.util.List;

/**
 * @Author: William
 * @Description:
 * @Date: Created in 17:35 2025/9/17
 * @Modified By:
 */
public interface IUserExppackageService extends IService<TblUserExppackage> {

    /**
     * 查询用户的资源包数据
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @return true:有可用的使用次数，false:没有可用的使用次数
     */
    TblUserExppackage queryUserExppackage(Long userId, UserExpPackageTypeEnum expType);

    /**
     * 查询用户的资源包数据
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @return true:有可用的使用次数，false:没有可用的使用次数
     */
    /**
     * 添加用户资源包次数
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @param times 次数
     * @param orderTradeNo 系统订单号
     * @return true-成功，false-失败
     */
    Boolean addUserExppackage(Long userId, UserExpPackageTypeEnum expType, Integer times, Date vipEndTime, String orderTradeNo);

    /**
     * 查询所有已到期的用户资源包
     * @return
     */
    List<TblUserExppackage> queryExpiredUserExppackage();

    /**
     * 冻结用户可用次数
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @param times 要冻结的次数
     * @return
     */
    Boolean freezeUserAvailableTimes(Long userId, UserExpPackageTypeEnum expType, Integer times);

    /**
     * 扣减用户冻结的次数，这发生在业务实际执行完的情况下
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @param times 要扣减的次数
     * @return
     */
    Boolean reduceFreezeTimes(Long userId, UserExpPackageTypeEnum expType, Integer times);

    /**
     * 把冻结的次数返还给用户，这发生在业务实际执行失败的情况下
     * @param userId 用户id
     * @param expType 会员能力类型 {@link UserExpPackageTypeEnum}
     * @param times 要扣减的次数
     * @return
     */
    Boolean returnFreezeTimes(Long userId, UserExpPackageTypeEnum expType, Integer times);

    /**
     * 用户资源包到期的时候，会调用这个接口把资源包置为不可用
     * @param id 资源包id
     * @return
     */
    int exipreUserExppackage(Long id);
}
